#ifndef IMAGEOPERATION_H
#define IMAGEOPERATION_H

#include <QObject>
#include <QUndoCommand>
#include <QVariant>
#include <QString>
#include <functional>
#include <QImage>
#include <QDir>

/**
 * @brief 图像操作类型枚举
 */
enum class ImageOperationType {
    ImageProcessing,      // 图像处理操作
    ImageMeasurement,     // 图像测量操作
    AxisParamsChange,     // 坐标轴参数改变
    ImageCalibration,     // 图像标定操作
    ImageZoom,            // 图像缩放操作
    Other                 // 其他操作类型
};

// 声明ImageOperationType为Qt元类型，使其可用于QVariant
Q_DECLARE_METATYPE(ImageOperationType);

/**
 * @brief 获取操作类型对应的字符串
 * @param type 操作类型
 * @return 操作类型的字符串表示
 */
QString operationTypeToString(ImageOperationType type);

/**
 * @brief 从字符串解析操作类型
 * @param typeStr 操作类型字符串
 * @return 对应的操作类型枚举值
 */
ImageOperationType stringToOperationType(const QString& typeStr);

/**
 * @brief 生成临时图像文件路径
 * @param imageGuid 图像GUID
 * @param operationType 操作类型
 * @param operationIndex 操作索引
 * @param tempDirectoryPath 临时目录路径
 * @return 临时文件路径
 */
QString generateTempImagePath(const QString& imageGuid, ImageOperationType operationType, int operationIndex, const QString& tempDirectoryPath);

/**
 * @brief 保存图像到临时文件
 * @param image 要保存的图像
 * @param tempPath 临时文件路径
 * @return 是否保存成功
 */
bool saveImageToTempFile(const QImage& image, const QString& tempPath);

/**
 * @brief 从临时文件加载图像
 * @param tempPath 临时文件路径
 * @return 加载的图像，如果失败则返回空图像
 */
QImage loadImageFromTempFile(const QString& tempPath);

/**
 * @brief 操作信息结构体，用于传递创建操作所需的全部信息
 */
struct OperationInfo {
    QString imageGuid;         // 图像GUID
    ImageOperationType type;   // 操作类型
    QVariant previousValue;    // 操作前的值
    QVariant newValue;         // 操作后的值
    std::function<bool(const QVariant&)> undoFunc; // 撤销函数
    std::function<bool(const QVariant&)> redoFunc; // 重做函数
    QString description;       // 操作描述
};

/**
 * @brief 图像操作类，继承自QUndoCommand
 * 用于管理图像处理相关的撤销/重做操作
 */
class ImageOperation : public QUndoCommand
{
public:
    ImageOperation(const QString& imageGuid,
                  ImageOperationType type,
                  const QVariant& previousValue,
                  const QVariant& newValue,
                  const std::function<bool(const QVariant&)>& undoFunc,
                  const std::function<bool(const QVariant&)>& redoFunc,
                  const QString& description = "",
                  const QString& tempDirectoryPath = "",
                  QUndoCommand *parent = nullptr);
    
    // 新增构造函数，接受OperationInfo结构体和临时目录路径
    explicit ImageOperation(const OperationInfo& info,
                          const QString& tempDirectoryPath = "",
                          QUndoCommand *parent = nullptr);
    
    ~ImageOperation() override;
    
    void undo() override;
    void redo() override;
    
    /**
     * @brief 获取图像GUID
     * @return 图像GUID
     */
    QString getImageGuid() const;
    
    /**
     * @brief 获取操作类型
     * @return 操作类型
     */
    ImageOperationType getType() const;
    
    /**
     * @brief 获取操作前的值
     * @return 操作前的值
     */
    QVariant getPreviousValue() const;
    
    /**
     * @brief 获取操作后的值
     * @return 操作后的值
     */
    QVariant getNewValue() const;
    
private:
    QString m_imageGuid;
    ImageOperationType m_type;
    QVariant m_previousValue;
    QVariant m_newValue;
    std::function<bool(const QVariant&)> m_undoFunc;
    std::function<bool(const QVariant&)> m_redoFunc;
    QString m_tempDirectoryPath; // 临时目录路径
    QList<QString> m_tempFiles; // 保存临时文件路径以便稍后清理
};

#endif // IMAGEOPERATION_H